home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 6: Level 6 / 17 Bit - Level 6 (1998)(Epic Marketing)[!].iso / quartz / q1073.dms / q1073.adf / CCONVERT.LHA / CConvert / CConvert1.82.s < prev    next >
Text File  |  1993-04-14  |  21KB  |  906 lines

  1. *
  2. * CConvert V1.82 © '92 CLAUDE
  3. *
  4. * Purpose.........: CConvert will convert an IFF file to raw bitplane datas
  5. * Usage...........: CConvert [FROM] <iffpic> [[TO] <rawpic>] [COLORS]
  6. *                        [INTERLEAVED|IL] [LINK] [MODE] [SPRITE] 
  7. *
  8. * Author..........: Klaus Wissmann
  9. * Version.........: V1.82
  10. * Requirements....: OS1.2 or higher
  11. *                   arp.library
  12. *
  13. * Revision History: V1.6   first released version
  14. *                   V1.7   added Sprite support
  15. *                   V1.8   added link mode
  16. *                   V1.81  some bug fixes
  17. *                   V1.82  added patternmatching, some bug fixes
  18. *                   
  19. *
  20. * (sorry, all the comments are in german...)
  21. *
  22. *                   
  23.  
  24.     opt o+,ow+
  25.  
  26.     incdir    "Include:"
  27.     include    exec/exec_lib.i
  28.     include    exec/memory.i
  29.     include    exec/strings.i
  30.     include    libraries/arpbase.i
  31.     include    libraries/dosextens.i
  32.  
  33. * Ein paar eigene Definitionen...
  34.  
  35. ID_FORM        equ    "FORM"
  36.  
  37.     rsreset
  38. FORM_id        rs.l    1
  39. FORM_Length    rs.l    1
  40. FORM_Type    rs.l    1
  41. FORM_Data    rs.l    1
  42.  
  43.     rsreset
  44. Chunk_id    rs.l    1
  45. Chunk_Length    rs.l    1
  46. Chunk_Data    rs.l    1
  47.  
  48. FORM_ILBM    equ    "ILBM"
  49. ID_BMHD        equ    "BMHD"
  50. ID_BODY        equ    "BODY"
  51. ID_CAMG        equ    "CAMG"
  52. ID_CMAP        equ    "CMAP"
  53. ID_SPRT        equ    "SPRT"
  54.  
  55.     rsreset
  56. BMHD_id            rs.l    1
  57. BMHD_Length        rs.l    1
  58. BMHD_Width        rs.w    1
  59. BMHD_Height        rs.w    1
  60. BMHD_LeftEdge        rs.w    1
  61. BMHD_TopEdge        rs.w    1
  62. BMHD_Depth        rs.b    1
  63. BMHD_Masking        rs.b    1
  64. BMHD_Compression    rs.b    1
  65. BMHD_pad1        rs.b    1
  66. BMHD_transparentColor    rs.w    1
  67. BMHD_xAspect        rs.b    1
  68. BMHD_yAspect        rs.b    1
  69. BMHD_pageWidth        rs.w    1
  70. BMHD_pageHeight        rs.w    1
  71.  
  72. cmp_None    equ    0
  73. cmp_ByteRun1    equ    1
  74.  
  75.     rsreset
  76. CMAP_red    rs.b    1
  77. CMAP_green    rs.b    1
  78. CMAP_blue    rs.b    1
  79.  
  80.     rsreset
  81. CAMG_id        rs.l    1
  82. CAMG_Length    rs.l    1
  83. CAMG_ViewModes    rs.l    1
  84.  
  85.     rsreset
  86. BODY_id        rs.l    1
  87. BODY_Length    rs.l    1
  88. BODY_Data    rs.l    1
  89.  
  90. hunk_unit    equ    $3e7
  91. hunk_name    equ    $3e8
  92. hunk_data    equ    $3ea
  93. hunk_ext    equ    $3ef
  94. hunk_end    equ    $3f2
  95. chip        equ    $40000000
  96. ext_def        equ    $01000000
  97.  
  98. CSI    equ    $9b
  99.     
  100.     section    main,code
  101.  
  102. start    RESIDENT 4000,(data_SIZE+text_SIZE),diskloaded
  103.     move.b    #1,colorcount(a4)    dieses ganze Zeug am Anfang ist nur
  104.     moveq    #108,d1            dazu da, um uns mit Arp's ARes resi-
  105.     move.l    d1,os_MyAP+ap_Length(a4) dent machen zu können
  106.     lea    data_SIZE(a4),a3
  107.     lea    textstart(pc),a2
  108.     move.l    #text_SIZE-1,d1
  109. copytext
  110.     move.b    (a2)+,(a3)+
  111.     dbf    d1,copytext
  112.     bra.s    notdiskld
  113. diskloaded
  114.     lea    Datas(pc),a4
  115. notdiskld
  116.     movem.l    d0/a0,-(sp)
  117.     
  118.     sub.l    a1,a1            als allererstes müssen wir sicher
  119.     move.l    (_SysBase).w,a6        sein, daß wir auch aus einem CLI ge-
  120.     SYSCALL    FindTask        startet wurden, ansonsten müssen wir
  121.     move.l    d0,a2            das Programm ordnungsgemäß beenden
  122.     tst.l    pr_CLI(a2)
  123.     bne.s    fromCLI
  124.     movem.l    (sp)+,d0/a0
  125.     lea    pr_MsgPort(a2),a0
  126.     SYSCALL    WaitPort
  127.     lea    pr_MsgPort(a2),a0
  128.     SYSCALL    GetMsg
  129.     move.l    d0,d2
  130.     SYSCALL    Forbid
  131.     move.l    d2,d0
  132.     SYSCALL    ReplyMsg
  133.     rts
  134. fromCLI
  135.     sub.l    a5,a5
  136.     moveq    #RETURN_FAIL,d7
  137.     lea    arpname(pc),a1
  138.     moveq    #39,d0
  139.     SYSCALL    OpenLibrary
  140.     move.l    d0,_ArpBase(a4)
  141.     bne.s    okgo
  142.     
  143.     lea    dosname(pc),a1        war es nicht möglich, die arp.library
  144.     SYSCALL    OpenLibrary        zu öffnen, wird versucht über die
  145.     tst.l    d0            dos.library eine Meldung auszugeben
  146.     beq.s    nodos            >alles Fehlgeschlagen,lieber aufhören
  147.     move.l    d0,a6
  148.     SYSCALL    Output
  149.     move.l    d0,d1
  150.     beq.s    nodos
  151.     lea    noarpmsg(pc),a0
  152.     move.l    a0,d2
  153.     moveq    #noarplength,d3
  154.     SYSCALL    Write
  155. nodos    addq.l    #8,sp
  156.     rts
  157.     
  158. okgo    move.l    d0,a6
  159.  
  160.     movem.l    (sp)+,d0/a0        Parameter zurückhohlen
  161.     lea    help(pc),a1        Argumentzeile auswerten
  162.     lea    oldPos(a4),a2
  163.     lea    Args(pc),a3
  164.     SYSCALL    GADS
  165.     tst.l    d0
  166.     bpl.s    openfile
  167.     move.l    oldPos(a4),a1        GADS hat einen Fehler zurückgegeben,
  168.     SYSCALL    Puts            als geben wir diesen aus und verab-
  169.     moveq    #RETURN_ERROR,d7    schieden uns
  170.     moveq    #ERROR_LINE_TOO_LONG,d2
  171.     bra    nomsg
  172.  
  173. openfile
  174.     lea    missrcfile(pc),a5    GADS meldet leider keinen Fehler,
  175.     moveq    #RETURN_ERROR,d7    falls überhaupt keine Parameter ange-
  176.     move.l    oldPos(a4),d0        geben wurden, obwohl wir ja mindes-
  177.     beq    closelib        tens einen benötigen (FROM/A)
  178.  
  179.     lea    os_nosrcfile(a4),a5    da wir Patternmatching unterstützen,
  180.     lea    os_MyAP(a4),a3        müssen wir erst mal nach einem pas-
  181.     move.l    a3,a0            senden Eintrag suchen
  182.     SYSCALL    FindFirst
  183.     cmp.b    #ERROR_NO_MORE_ENTRIES,d0
  184.     bne.s    dontchange
  185.     move.b    #ERROR_OBJECT_NOT_FOUND,d0
  186. dontchange
  187.     move.b    d0,-1(a5)
  188.     bne    closelib
  189.     
  190.     lea    ap_Buf(a3),a0        haben wir einen gefunden, geben wir
  191.     SYSCALL    BaseName        dessen Namen auch aus, damit der
  192.     lea    readsrc(pc),a0        User auch weis, was wir gerade bear-
  193.     lea    os_readsrcstr(a4),a1    beiten
  194.     move.l    d0,(a1)
  195.     SYSCALL    Printf
  196.     
  197.     lea    ap_Buf(a3),a0        eigentlich gibt FindFirst() ja einen
  198.     move.l    a0,d1            FileInfoBlock zurück, leider ist
  199.     moveq    #ACCESS_READ,d2        dies nicht immer der des gewünschten 
  200.     SYSCALL    ArpLock            Files, sondern (falls z.B. das
  201.     move.l    d0,d1            Directory schon abgekürzt wurde) auch
  202.     beq    errorfromdos        manchmal den eines Parentdirs. Des-
  203.     lea    os_MyFIB(a4),a2        halb müssen wir uns eben unseren
  204.     move.l    a2,d2            FileInfoBlock selber besorgen
  205.     SYSCALL    Examine
  206.     tst.l    d0
  207.     beq    errorfromdos
  208.  
  209.     lea    nomem(pc),a5        bevor wir das IFF-File einlesen kön-
  210.     moveq    #RETURN_FAIL,d7        nen brauchen wir erst mal einen aus-
  211.     move.l    fib_Size(a2),d0        reichend großen Speicherbereich
  212.     move.l    d0,d4
  213.     moveq    #0,d1
  214.     SYSCALL    ArpAllocMem
  215.     move.l    d0,d6
  216.     beq    closelib
  217.     
  218.     lea    os_nosrcfile(a4),a5    jetzt müssen wir die Datei eigentlich
  219.     moveq    #RETURN_ERROR,d7    nur noch öffnen und einlesen
  220.     lea    ap_Buf(a3),a1
  221.     move.l    a1,d1
  222.     move.l    #MODE_OLDFILE,d2
  223.     SYSCALL    ArpOpen
  224.     move.l    d0,d1
  225.     beq    errorfromdos
  226.     move.l    d6,d2
  227.     move.l    d4,d3
  228.     lea    os_nosrcdata(a4),a5
  229.     SYSCALL    Read
  230.     tst.l    d0
  231.     bmi    errorfromdos
  232.     cmp.l    d4,d0
  233.     bne    closelib
  234.  
  235.     lea    noiff(pc),a5        wir müssen schon sicher sein, ob es
  236.     move.l    d6,a2            sich überhaupt um ein IFF ILBM File
  237.     cmp.l    #ID_FORM,FORM_id(a2)    handelt, deshalb machen wir ein paar
  238.     bne    closelib        kleine Tests
  239.     lea    corruptiff(pc),a5
  240.     move.l    FORM_Length(a2),d1
  241.     addq.l    #8,d1
  242.     cmp.l    d1,d0
  243.     bcs    closelib
  244.     beq.s    hascorrectlength
  245.     move.l    d1,d4
  246.     lea    file2long(pc),a1
  247.     SYSCALL    Puts
  248. hascorrectlength    
  249.     lea    noilbm(pc),a5
  250.     cmp.l    #FORM_ILBM,FORM_Type(a2)
  251.     bne    closelib
  252.     
  253. * auswerten
  254.  
  255.     lea    os_printchunk(a4),a3    im nächsten Programmteil schauen wir
  256.     lea    os_insclaenge(a4),a5    uns erstmal genauer an, wo die
  257.      lea    FORM_Data(a2),a2    Chunks eigentlich liegen;die Anfangs-
  258.      add.l    d4,d6            adressen der Chunks speichern wir in
  259. getnextchunk                   *den jeweiligen Variablen
  260.     move.l    Chunk_Length(a2),d5    Länge des Chunks
  261.     move.l    Chunk_id(a2),d4        Name des Chunks
  262.     cmp.l    #ID_BMHD,d4        ab hier wird solange verglichen, bis
  263.     bne.s    nobmhd            der richtige Chunk gefunden ist
  264.     move.l    a2,BMHDpos(a4)
  265.     bra.s    foundChunk
  266. nobmhd    cmp.l    #ID_CMAP,d4
  267.     bne.s    nocmap
  268.     move.l    a2,CMAPpos(a4)
  269.     bra.s    foundChunk
  270. nocmap    cmp.l    #ID_BODY,d4
  271.     bne.s    nobody
  272.     move.l    a2,BODYpos(a4)
  273.     bra.s    foundChunk
  274. nobody    cmp.l    #ID_CAMG,d4
  275.     bne.s    nocamg
  276.     move.l    a2,CAMGpos(a4)
  277.     bra.s    foundChunk
  278. nocamg    cmp.l    #ID_SPRT,d4
  279.     bne.s    nosprt
  280.     move.l    a2,SPRTpos(a4)
  281.     moveq    #-1,d0
  282.     move.l    d0,sSPRITE(a4)
  283. nosprt
  284. foundChunk
  285.     move.l    d4,(a3)            wir wollen ja auch ein bißchen User-
  286.     move.l    a3,a0            freundlich sein; deshalb zeigen wir
  287.     move.l    d5,(a5)            alle Chunks mitsamt ihrer Länge an
  288.     move.l    a5,a1
  289.     SYSCALL    Printf
  290.     addq.l    #1,d5
  291.     and.b    #%11111110,d5
  292.     add.l    d5,a2            jetzt springen wir zum Anfang des
  293.     lea    Chunk_Data(a2),a2    nächsten Chunks und fangen von vorne
  294.     cmp.l    d6,a2            an
  295.     bcs.s    getnextchunk
  296.  
  297.     lea    misbody(pc),a5
  298.     tst.l    BODYpos(a4)
  299.     beq    closelib
  300.     lea    misbmhd(pc),a5        jetzt müssen wir erst mal den
  301.     tst.l    BMHDpos(a4)        BitMapHeaDer auswerten, damit wir die
  302.     beq    closelib        ganze Sache auch richtig konvertieren
  303.     move.l    BMHDpos(a4),a2        können
  304.     move.w    BMHD_pageWidth(a2),ScreenBreite(a4)
  305.     move.w    BMHD_pageHeight(a2),ScreenHoehe(a4)
  306.     moveq    #0,d0
  307.     move.w    BMHD_Width(a2),d0    zuerste lesen wir die Breite der
  308.     move.w    d0,os_insbreite1(a4)    Grafik aus...
  309.     add.w    #15,d0            ...die müssen wir dann in Bytes um-
  310.     and.b    #%11110000,d0        wandeln, außerdem muß der Wert an
  311.     lsr.w    #3,d0            einer Wortgrenze liegen
  312.     move.w    d0,Breite(a4)
  313.     move.w    d0,os_insbreite2(a4)
  314.     move.w    BMHD_Height(a2),d2    die Höhe brauchen wir auch noch ...
  315.     mulu    d2,d0
  316.     move.w    d2,Hoehe(a4)
  317.     move.w    d2,os_inshoehe(a4)
  318.     move.l    d0,d6
  319.     moveq    #0,d2
  320.     move.b    BMHD_Depth(a2),d2    und die Tiefe könnte auch nicht
  321.     move.b    d2,Tiefe(a4)        schaden
  322.     move.w    d2,os_instiefe(a4)
  323.     mulu    d2,d0
  324.     subq.b    #1,d2            bei nur einer Plane müssen wir das
  325.     bne.s    plural            's' rausradieren
  326.     move.b    #" ",os_insplural(a4)
  327. plural    move.l    d0,os_inslaenge(a4)
  328.     move.l    d0,PlBufLength(a4)    jetzt brauch wir jede Menge Speicher
  329.     moveq    #0,d1            zum einen einen Block für die ent-
  330.     SYSCALL    ArpAllocMem        packten, noch nicht konvertierten
  331.     lea    nomem(pc),a5        Daten ...
  332.     moveq    #RETURN_FAIL,d7
  333.     move.l    d0,PlaneBuffer(a4)
  334.     beq    closelib
  335.     move.l    PlBufLength(a4),d0
  336.     add.l    #200,d0            und dann noch einmal Speicher für die
  337.     move.l    #MEMF_CLEAR,d1        endgültigen Daten; der 2. Block muß
  338.     SYSCALL    ArpAllocMem        etwas länger sein, um auch die Daten
  339.     move.l    d0,DestBuffer(a4)    für Link-/Sprite-Mode aufzunehmen
  340.     move.l    d0,realStart(a4)
  341.     beq    closelib
  342.     tst.l    labelPos(a4)
  343.     beq.s    normMode
  344.     lea    header(pc),a0        soll ein Object-File erzeugt werden,
  345.     move.l    d0,a1            muß vor die eigentlichen Daten der
  346.     moveq    #(headerlength/4)-1,d1    ganze hunk-Ramsch geschrieben werden
  347. copyheader
  348.     move.l    (a0)+,(a1)+
  349.     dbf    d1,copyheader
  350.     move.l    a1,PosSave(a4)
  351.     lea    4(a1),a1
  352.     move.l    a1,DestBuffer(a4)
  353. normMode
  354.     move.b    BMHD_Compression(a2),d0    sollte das Bild mit einem anderen
  355.     move.b    d0,comp(a4)        Packalgorythmus als dem ByteRun1 ge-
  356.     beq.s    nocompression        packt worden sein (gibt's sowas über-
  357.     lea    wrongcompress(pc),a5    haupt schon?), so muß CConvert leider
  358.     moveq    #RETURN_ERROR,d7    passen
  359.     subq.b    #1,d0
  360.     bne    closelib
  361.     move.b    #LF,os_longdata(a4)
  362. nocompression
  363.     lea    os_picdata(a4),a0    jetzt ist es endlich soweit: der
  364.     lea    os_insbreite1(a4),a1    ganze vorbereitete Text wird ausgege-
  365.     SYSCALL    Printf            ben
  366.     
  367.     move.l    BODYpos(a4),a1        jetzt können wir uns endlich dem
  368.     move.l    Chunk_Length(a1),d5    BODY-Chunk widmen
  369.     lea    BODY_Data(a1),a1
  370.     move.l    PlaneBuffer(a4),a3
  371.     move.l    PlBufLength(a4),d0
  372.     tst.l    sSPRITE(a4)        wenn wir eine Sprite-Datenliste er-
  373.     beq.s    testileaved        zeugen sollen läuft die Sache ganz
  374. convsprite                   *anders ab
  375.     move.l    DestBuffer(a4),a3
  376.     lea    wrongdim(pc),a5
  377.     moveq    #2,d1
  378.     cmp.w    Breite(a4),d1
  379.     bne    closelib
  380.     cmp.b    Tiefe(a4),d1
  381.     bne.s    fourcolsprite
  382.     addq.l    #4,os_inslaenge(a4)
  383.     clr.l    (a3)+            bei 4-farbigen Sprite ist die Sache
  384.     lsr.l    #2,d0            ziemlich einfach, da ein Sprite ja
  385.     subq.l    #1,d0            auch "interleaved" aufgebaut ist
  386. copysprite
  387.     move.l    (a1)+,(a3)+
  388.     dbf    d0,copysprite
  389.     move.l    a3,DestBuffer(a4)
  390.     bra    dspmodes
  391. fourcolsprite
  392.     cmp.b    #4,Tiefe(a4)
  393.     bne    closelib
  394.     addq.l    #8,os_inslaenge(a4)
  395.     lsr.l    d0            beim 16-farbigen Sprite ist es etwas
  396.     move.l    d0,d1            schwieriger, da wir zwei Sprites er-
  397.     lea    os_insoffset(a4),a0    zeugen müssen; damit der User auch
  398.     movem.l    d0-d1,(a0)        weis, wo sich das zweite Sprite be-
  399.     clr.l    (a3)+            findet, wird der Offset ausgegeben
  400.     lea    (a3,d0),a0
  401.     clr.l    (a0)+
  402.     lsr.l    #2,d0
  403.     subq.l    #1,d0
  404. copy4sprite
  405.     move.l    (a1)+,(a3)+
  406.     move.l    (a1)+,(a0)+
  407.     dbf    d0,copy4sprite
  408.     move.l    a0,DestBuffer(a4)
  409.     lea    sproffset(pc),a0
  410.     lea    os_insoffset(a4),a1
  411.     SYSCALL    Printf
  412.     bra    dspmodes
  413.  
  414. testileaved
  415.     tst.l    sILEAVED(a4)        wurde INTERLEAVED angegeben, müssen
  416.     beq.s    testcomp        wir die Daten nur entpacken
  417.     move.l    DestBuffer(a4),a3
  418.     add.l    d0,DestBuffer(a4)
  419. testcomp
  420.     tst.b    comp(a4)        gepackt ?
  421.     bne.s    depackstart
  422.     subq.l    #1,d0
  423. unpacked
  424.     move.b    (a1)+,(a3)+
  425.     dbf    d0,unpacked
  426.     bra.s    separate
  427. depackstart
  428.     move.l    a3,a0
  429.     add.l    d0,a0
  430. depack
  431.     cmp.l    a0,a3            Daten entpacken
  432.     bcc.s    separate
  433.     moveq    #0,d2
  434.     move.b    (a1)+,d2
  435.     bpl.s    copyloop
  436.     cmp.b    #-128,d2
  437.     beq.s    depack
  438.     neg.b    d2
  439. depackloop
  440.     move.b    (a1),(a3)+
  441.     dbf    d2,depackloop
  442.     lea    1(a1),a1
  443.     bra.s    depack
  444. copyloop
  445.     move.b    (a1)+,(a3)+
  446.     dbf    d2,copyloop
  447.     bra.s    depack
  448.  
  449. separate    
  450.     tst.l    sILEAVED(a4)
  451.     bmi.s    dspmodes
  452.     move.l    PlaneBuffer(a4),a3    es ist eine ganz schöne Arbeit, die
  453.     move.l    DestBuffer(a4),a6    Daten in das RAW-Format zu konver-
  454.     move.w    Hoehe(a4),d3        tieren
  455.     subq.w    #1,d3
  456.     move.w    Breite(a4),d4
  457.     subq.w    #1,d4
  458.     move.l    d6,d1
  459.     sub.w    Breite(a4),d1
  460.     moveq    #0,d0
  461.     move.b    Tiefe(a4),d0
  462.     mulu    d0,d6
  463.     sub.w    Breite(a4),d6
  464.  
  465. newline    moveq    #0,d0
  466.     move.b    Tiefe(a4),d0
  467.     subq.b    #1,d0
  468. nextplane
  469.     move.l    d4,d2
  470. copyline
  471.     move.b    (a3)+,(a6)+
  472.     dbf    d2,copyline        zuerst eine Zeile kopieren,
  473.     add.l    d1,a6            dann die nächste Plane
  474.     dbf    d0,nextplane        alle Planes kopieren
  475.     sub.l    d6,a6
  476.     dbf    d3,newline        alle Zeilen kopieren
  477.     move.l    _ArpBase(a4),a6
  478.     move.l    PlBufLength(a4),d0
  479.     add.l    d0,DestBuffer(a4)
  480.  
  481. dspmodes
  482.     tst.l    sMODE(a4)        hier werden noch ein paar Daten über
  483.     beq.s    dspcmap            den verwendeten Bildschirm ausgege-
  484.     move.w    ScreenBreite(a4),os_inspw(a4) ben
  485.     move.w    ScreenHoehe(a4),os_insph(a4)
  486.     tst.l    CAMGpos(a4)        wenn ein CAMG-Chunk vorhanden ist,
  487.     beq.s    printscreen        können wir viel mehr erzählen...
  488.     move.l    CAMGpos(a4),a2
  489.     move.l    CAMG_ViewModes(a2),d4
  490.     cmp.b    #6,Tiefe(a4)
  491.     bne.s    getres
  492.     lea    ham(pc),a1
  493.     btst    #11,d4
  494.     bne.s    insertmode
  495.     lea    dualpf(pc),a1
  496.     btst    #10,d4
  497.     bne.s    insertmode
  498.     lea    ehb(pc),a1
  499. insertmode
  500.     move.l    a1,os_insmode(a4)
  501. getres
  502.     lea    hires(pc),a1
  503.     btst    #15,d4
  504.     bne.s    testmed
  505.     lea    interlace(pc),a1
  506.     btst    #2,d4
  507.     bne.s    printresolution
  508.     lea    lores(pc),a1
  509.     bra.s    printresolution
  510. testmed    btst    #2,d4
  511.     bne.s    printresolution
  512.     lea    medres(pc),a1
  513. printresolution
  514.     move.l    a1,os_insres(a4)
  515. printscreen
  516.     lea    scrform(pc),a0
  517.     lea    os_inspw(a4),a1
  518.     SYSCALL    Printf
  519.     
  520. dspcmap
  521.     tst.l    sCOLORS(a4)        wenn es gewünscht wird, geben wir
  522.     beq.s    writeback        auch noch die Farbtabelle aus
  523.     tst.l    CMAPpos(a4)
  524.     bne.s    cmapfound
  525.     lea    miscmap(pc),a1
  526.     SYSCALL    Puts
  527.     bra.s    writeback
  528. cmapfound
  529.     move.l    CMAPpos(a4),a2
  530.     move.l    Chunk_Length(a2),d5
  531.     moveq    #30,d1
  532.     cmp.l    d1,d5
  533.     bcs.s    dispcols
  534.     addq.b    #1,os_stellen(a4)
  535.     cmp.l    #300,d5
  536.     bcs.s    dispcols
  537.     addq.b    #1,os_stellen(a4)
  538. dispcols
  539.     lea    Chunk_Data(a2),a2
  540. convcol    moveq    #0,d2
  541.     move.b    CMAP_red(a2),d2        ROT-Anteil
  542.     lsl.w    #4,d2
  543.     move.b    CMAP_blue(a2),d2    BLAU-Anteil
  544.     lsr.b    #4,d2
  545.     or.b    CMAP_green(a2),d2    GRÜN-Anteil
  546.     move.w    d2,os_inswert(a4)
  547.     subq.b    #1,colorcount(a4)
  548.     bne.s    nolf
  549.     move.b    #4,colorcount(a4)
  550.     sub.l    a1,a1
  551.     SYSCALL    Puts
  552. nolf
  553.     lea    farbe(pc),a0
  554.     lea    os_insnum(a4),a1
  555.     SYSCALL    Printf
  556.     addq.w    #1,os_insnum(a4)
  557.     lea    3(a2),a2        zur nächsten Farbe
  558.     subq.l    #3,d5
  559.     bne.s    convcol
  560.     sub.l    a1,a1
  561.     SYSCALL    Puts
  562.     
  563. writeback
  564.     lea    rawlength(pc),a0
  565.     lea    os_inslaenge(a4),a1
  566.     SYSCALL    Printf
  567.  
  568.     move.l    labelPos(a4),d0        schlußendlich müssen wir das ganze
  569.     beq.s    saveitnow        auch noch abspeichern
  570.     move.l    DestBuffer(a4),d1    wenn wir uns im Link-Mode befinden,
  571.     addq.l    #3,d1            müssen wir den ganzen Overhead davor
  572.     and.b    #%11111100,d1        bzw. dahinter noch vervollständigen
  573.     move.l    d1,a1
  574.     move.l    PosSave(a4),a0
  575.     sub.l    a0,d1
  576.     lsr.l    #2,d1
  577.     subq.l    #1,d1
  578.     move.l    d1,(a0)
  579.     move.l    #hunk_ext,(a1)+
  580.     move.l    a1,a2
  581.     lea    4(a2),a2
  582.     move.l    d0,a0
  583.     moveq    #2,d0
  584. copyname
  585.     addq.b    #1,d0
  586.     move.b    (a0)+,(a2)+
  587.     bne.s    copyname
  588.     and.b    #%11111100,d0
  589.     lea    12(a1,d0),a2
  590.     lsr.b    #2,d0
  591.     or.l    #ext_def,d0
  592.     move.l    d0,(a1)
  593.     move.l    #hunk_end,(a2)+
  594.     sub.l    realStart(a4),a2
  595.     move.l    a2,PlBufLength(a4)
  596.     
  597. saveitnow
  598.     lea    done(pc),a5        das ganze wird jetzt noch auf Disk
  599.     moveq    #RETURN_OK,d7        gebannt, wurde kein Zielfile angege-
  600.     move.l    newPos(a4),d1        ben, war die ganze Arbeit eigentlich
  601.     beq.s    closelib        umsonst
  602.     lea    os_nodestfile(a4),a5
  603.     moveq    #RETURN_ERROR,d7
  604.     move.l    #MODE_NEWFILE,d2
  605.     SYSCALL    ArpOpen
  606.     move.l    d0,d4
  607.     beq.s    errorfromdos
  608.     
  609.     lea    writedest(pc),a1
  610.     SYSCALL    Puts
  611.  
  612.     lea    os_nodestdata(a4),a5    die Länge des Files muß noch berech-
  613.     move.l    realStart(a4),d2    net werden, da sie je nach verwende-
  614.     move.l    PlBufLength(a4),d3    ten Modus sehr verschieden sein kann
  615.     tst.l    sSPRITE(a4)
  616.     beq.s    nospr
  617.     move.b    Tiefe(a4),d0
  618.     lsl.b    d0
  619.     add.l    d0,d3
  620. nospr
  621.     move.l    d4,d1
  622.     SYSCALL    Write
  623.     tst.l    d0
  624.     bmi.s    errorfromdos
  625.     
  626.     moveq    #RETURN_OK,d7
  627.     lea    done(pc),a5
  628.     bra.s    closelib
  629.  
  630. errorfromdos
  631.     SYSCALL    IoErr            ist ein Fehler bei einem dos.library
  632.     tst.b    d0            Aufruf entstanden, wird auch noch
  633.     beq.s    closelib        Result2 geholt
  634.     move.b    d0,-1(a5)
  635. closelib    
  636.     moveq    #0,d2            außerdem wird noch die passende
  637.     cmp.l    d2,a5            Fehlermeldung dazu ausgegeben
  638.     beq.s    nomsg
  639.     move.l    a5,a1
  640.     SYSCALL    Puts
  641.     move.b    -1(a5),d2
  642. nomsg
  643.     move.l    d7,d0
  644.     SYSCALL    ArpExit
  645.  
  646. * Texte
  647.  
  648. dosname    DOSNAME
  649. noarpmsg    dc.b    "you need "
  650. arpname    ArpName
  651.         dc.b    " V39+",CR,LF
  652. noarplength    equ    *-noarpmsg
  653.  
  654.         cnop    0,4
  655. header        dc.l    hunk_unit,(endofmod-*-8)/4
  656.         dc.b    "Graphic_MODULE"
  657.         cnop    0,4
  658. endofmod    dc.l    hunk_name,(endofname-*-8)/4
  659.         dc.b    "Graphic-Datas"
  660.         cnop    0,4
  661. endofname    dc.l    chip!hunk_data
  662. headerlength    equ    *-header
  663.  
  664. * Normale Texte
  665.  
  666. help        dc.b    LF,CSI,"0;33mCConvert",CSI,"0;39m V1.82 © '92 by "
  667.         dc.b    CSI,"1;32mKlaus Wissmann",CSI,"0;39m",CR,LF,LF
  668.         dc.b    "Usage: CConvert [FROM] <iffpic> [[TO] <rawfile>] "
  669.         dc.b    "[LINK label]",CR,LF
  670.         dc.b    "      [COLORS] [INTERLEAVED|IL] [MODE] "
  671.         dc.b    "[SPRITE]",CR,LF,LF
  672.         dc.b    CSI,"1m          FROM",CSI,"0m"
  673.         dc.b    " - an IFF picture which should be converted",CR,LF
  674.         dc.b    CSI,"1m            TO",CSI,"0m"
  675.         dc.b    " - this file will be created",CR,LF
  676.         dc.b    CSI,"1m          LINK",CSI,"0m"
  677.         dc.b    " - specifies a label for link mode (see manual)",CR
  678.         dc.b    LF,LF
  679.         dc.b    CSI,"1m        COLORS",CSI,"0m"
  680.         dc.b    " - print out colortable",CR,LF
  681.         dc.b    CSI,"1m   INTERLEAVED",CSI,"0m"
  682.         dc.b    " - keep the interleaved format and "
  683.         dc.b    "just depack if necessary",CR,LF
  684.         dc.b    CSI,"1m          MODE",CSI,"0m"
  685.         dc.b    " - print out screensize and viewmodes",CR,LF
  686.         dc.b    CSI,"1m        SPRITE",CSI,"0m"
  687.         dc.b    " - convert to sprite data list",CR,LF
  688.         dc.b    0
  689.  
  690. Args        dc.b    "FROM/A,TO,LINK/K,COLORS/S,IL=INTERLEAVED/S,MODE/S,"
  691.         dc.b    "SPRITE/S",0
  692.  
  693.         dc.b    ERROR_LINE_TOO_LONG
  694. missrcfile    dc.b    "Required argument missing",0
  695.  
  696. readsrc        dc.b    LF,"Reading file '%s'.",CR,LF,LF,0
  697.  
  698. file2long    dc.b    "Corrupt IFF File - Additional data not recognized!"
  699.         dc.b    LF,0
  700.  
  701. corruptiff    dc.b    "Corrupt IFF File !",0
  702.  
  703.         dc.b    ERROR_OBJECT_WRONG_TYPE
  704. noiff        dc.b    "Not an IFF File !",0
  705.  
  706.         dc.b    ERROR_OBJECT_WRONG_TYPE
  707. noilbm        dc.b    "File is IFF but not ILBM type !",0
  708.  
  709.         dc.b    ERROR_NO_FREE_STORE
  710. nomem        dc.b    "Can't allocate memory !",0
  711.  
  712. misbmhd        dc.b    "Missing BMHD-Chunk !!!",0
  713.  
  714. wrongcompress    dc.b    "Compression mode not recognized !",0
  715.  
  716. misbody        dc.b    "Missing BODY-Chunk !!!",0
  717.  
  718. lores        dc.b    " Lo-Res",0
  719.  
  720. medres        dc.b    " Med-Res",0
  721.  
  722. interlace    dc.b    " interlaced",0
  723.  
  724. hires        dc.b    " Hi-Res",0
  725.  
  726. ham        dc.b    " Hold and Modify",0
  727.  
  728. dualpf        dc.b    " Dual-Playfield",0
  729.  
  730. ehb        dc.b    " Extra-Halfbright",0
  731.  
  732. scrform        dc.b    CR,LF,"Screen format: %d x %d pixel%s%s screen."
  733.         dc.b    CR,LF,0
  734.  
  735. wrongdim    dc.b    "Wrong dimension for a sprite !",0
  736.  
  737. sproffset    dc.b    CR,LF,"Sprite 2 can be adressed at offset "
  738.         dc.b    "%ld / 0x%lx.",CR,LF,0
  739.  
  740. miscmap        dc.b    "No colormap available !",0
  741.  
  742. rawlength    dc.b    LF,"Size in all: %ld bytes",CR,LF,0
  743.  
  744. writedest    dc.b    LF,"Writing to destination file.",LF,0
  745.  
  746. done        dc.b    LF,"Done.",0
  747.  
  748. * Daten
  749.  
  750.     cnop    0,4
  751. Datas    dc.l    0
  752.     dc.l    0
  753.     dc.l    0
  754.     dc.l    0
  755.     dc.l    0
  756.     dc.l    0
  757.     dc.w    0
  758.     dc.w    0
  759.     dc.b    0
  760.     dc.b    -1
  761.     dc.b    1
  762.     dc.b    0
  763.     ds.l    7
  764.     ds.l    5
  765.     dc.w    0
  766.     dc.w    0
  767.  
  768.  
  769.     rsreset
  770. _ArpBase    rs.l    1
  771. PlaneBuffer    rs.l    1    Zeiger auf ersten Speicherblock
  772. realStart    rs.l    1    Zeiger auf zweiten Speicherblock
  773. DestBuffer    rs.l    1    momentante Position im 2. Puffer
  774. PlBufLength    rs.l    1    Länge der erzeugten Daten
  775. PosSave        rs.l    1    hier wird die Länge des Hunks eingetragen
  776. Breite        rs.w    1    die Dimensionen des Bildes
  777. Hoehe        rs.w    1
  778. Tiefe        rs.b    1
  779. masking        rs.b    1
  780. colorcount    rs.b    1
  781. comp        rs.b    1    Compression-Mode
  782. oldPos        rs.l    1    Array für GADS: zuerst die Zeiger auf Source
  783. newPos        rs.l    1    und Zielfile
  784. labelPos    rs.l    1    Zeiger auf Label für Link-Mode
  785. sCOLORS        rs.l    1    und dann die restlichen Schlüsselwörter
  786. sILEAVED    rs.l    1
  787. sMODE        rs.l    1
  788. sSPRITE        rs.l    1
  789. BMHDpos        rs.l    1    Positionen der benötigten Chunks
  790. CMAPpos        rs.l    1
  791. BODYpos        rs.l    1
  792. CAMGpos        rs.l    1
  793. SPRTpos        rs.l    1
  794. ScreenBreite    rs.w    1    
  795. ScreenHoehe    rs.w    1
  796. data_SIZE    rs.w    0
  797.  
  798.  
  799. * Zu verändernde Texte / Daten-Strukturen
  800.  
  801. textstart
  802.  
  803. MyAP        dc.l    0        ap_Base
  804.         dc.l    0        ap_Last
  805.         dc.l    0        ap_BreakBits
  806.         dc.l    0        ap_FoundBreak
  807.         dc.l    108        ap_Length
  808.         ds.b    fib_SIZEOF    ap_Info
  809.         ds.b    108        ap_Buf
  810.  
  811. MyFIB        ds.b    fib_SIZEOF
  812.  
  813. readsrcstr    dc.l    0
  814.  
  815. insclaenge    dc.l    0
  816.  
  817. insbreite1    dc.w    0
  818. insbreite2    dc.w    0
  819. inshoehe    dc.w    0
  820. instiefe    dc.w    0
  821.  
  822. inslaenge    dc.l    0
  823.  
  824. insoffset    dc.l    0,0
  825.  
  826. inspw        dc.w    0
  827. insph        dc.w    0
  828. insmode        dc.l    0
  829. insres        dc.l    0
  830.  
  831. insnum        dc.w    0
  832. inswert        dc.w    0
  833.  
  834.         even
  835.  
  836.         dc.b    ERROR_OBJECT_NOT_FOUND
  837. nosrcfile    dc.b    "Can't open source file !",0
  838.  
  839.  
  840.         dc.b    0
  841. nosrcdata    dc.b    "Can't read source file !",0
  842.  
  843.         even
  844. printchunk    dc.b    "XXXX %6ld",CR,LF,0
  845.  
  846. picdata        dc.b    CR,LF,"Width : %3d pixel",CR,LF
  847.         dc.b    "        %3d bytes",CR,LF
  848.         dc.b    "Height: %3d lines",CR,LF
  849.         dc.b    "Depth : %3d plane"
  850. insplural    dc.b    "s",CR,LF
  851. longdata    dc.b    0,"This file was compressed using ByteRun1.",CR,LF
  852.         dc.b    0
  853.  
  854. farbe        dc.b    "Color %"
  855. stellen        dc.b    "1d: $%04x   ",0
  856.  
  857.         dc.b    0
  858. nodestfile    dc.b    "Can't open destination file !",0
  859.  
  860.         dc.b    0
  861. nodestdata    dc.b    "Can't write to destionation file !",0
  862.  
  863. text_SIZE    equ    *-textstart
  864.  
  865. * Offsets
  866.  
  867. os_MyAP        equ    MyAP-Datas
  868. os_MyFIB    equ    MyFIB-Datas
  869.  
  870. os_readsrcstr    equ    readsrcstr-Datas
  871.  
  872. os_insclaenge    equ    insclaenge-Datas
  873.  
  874. os_insbreite1    equ    insbreite1-Datas
  875. os_insbreite2    equ    insbreite2-Datas
  876. os_inshoehe    equ    inshoehe-Datas
  877. os_instiefe    equ    instiefe-Datas
  878.  
  879. os_inslaenge    equ    inslaenge-Datas
  880.  
  881. os_insoffset    equ    insoffset-Datas
  882.  
  883. os_inspw    equ    inspw-Datas
  884. os_insph    equ    insph-Datas
  885. os_insmode    equ    insmode-Datas
  886. os_insres    equ    insres-Datas
  887.  
  888. os_insnum    equ    insnum-Datas
  889. os_inswert    equ    inswert-Datas
  890.  
  891. os_nosrcfile    equ    nosrcfile-Datas
  892.  
  893. os_nosrcdata    equ    nosrcdata-Datas
  894.  
  895. os_farbe    equ    farbe-Datas
  896. os_stellen    equ    stellen-Datas
  897. os_printchunk    equ    printchunk-Datas
  898.  
  899. os_picdata    equ    picdata-Datas
  900. os_insplural    equ    insplural-Datas
  901. os_longdata    equ    longdata-Datas
  902.  
  903. os_nodestfile    equ    nodestfile-Datas
  904. os_nodestdata    equ    nodestdata-Datas
  905.  
  906.